﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.lplq
    不等式约束线性规划问题
    int lplq(int m,int n, double a[], double b[], double c[], double x[])
    参数 m: 不等式约束条件个数。
    参数 n: 变量个数
    参数 a: a[m][m+n]左边n列存放不等式约束条件左端的系数矩阵，右边m列为单位矩阵。
    参数 b: b[m]存放不等式约束条件右端项值。
    参数 c: c[m+n]存放目标函数中的系数，其中后m个分量为0。
    参数 x: x[m+n]前n个分量返回目标函数f的极小值点的n个坐标；第n+1个分量返回目标函数f的极小值。
    返回值 函数返回标志值。若=0表示矩阵求逆失败，若<0表示目标函数值无界，若>0正常。
    */

    public static string drive_lplq()
    {
        int i;
        double[] x = new double[6];
        double[,] a = new double[3, 6] {
            {1.0,2.0,7.0,1.0,0.0,0.0},
            {1.0,4.0,13.0,0.0,1.0,0.0},
            {0.0,2.0,8.0,0.0,0.0,1.0}
        };
        double[] b = new double[3] { 10.0, 18.0, 13.0 };
        double[] c = new double[6] { -4.0, -9.0, -26.0, 0.0, 0.0, 0.0 };

        string rs = "";
        rs += gl.html_table("A", a);
        rs += gl.html_table("B", b);
        rs += gl.html_table("C", c);

        i = gl.lplq(3, 3, a, b, c, x);
        if (i <= 0) return "error: 0";
        rs += gl.html_table("X", x);

        return rs;
    }
}